#include <QCoreApplication>
#include <QThread>
#include <QSemaphore>
#include <QDebug>

const int BufferSize = 5; //仓库大小
const int DataSize = 20; //生产产品的总数

int buffer[BufferSize]; //仓库

//控制生产者信号量,刚开始生产者有5个可用位置
QSemaphore freeSpace(BufferSize);

//控制消费者的信号量, 刚开始为0
QSemaphore usedSpace(0);

//生产者线程
class threadProducer : public QThread {
public:
    void run (void)
    {
         for (int i = 0; i < DataSize; i++) {
             freeSpace.acquire(); //P:-1
             //当仓库中有空闲位置时, 向对应的位置放数据即可
             buffer[i%BufferSize] = i+1;
             qDebug ("producer: %d", buffer[i%BufferSize]);
             //当仓库中生产一个产品, 多了一个可消费的产品, 控制消费者的信号量+1
             usedSpace.release(); //V:+1
         }
    }
};

//消费者线程
//仓库中产品的个数是共享资源
class threadConsumer: public QThread {
public:
    void run (void) {
        for (int i = 0; i < DataSize; i++) {
            //如果仓库中有可用产品, 获取成功, 否则阻塞
            usedSpace.acquire(); //P: -1
            qDebug ("consumer :%d",buffer[i%BufferSize]);
            //消费掉一个产品, 仓库多出来一个可以存放产品的位置
            freeSpace.release(); //V: +1
        }
    }
};

int main (int argc, char **argv)
{
   //创建无GUI的应用程序
   QCoreApplication app (argc, argv);
   threadProducer producer;
   threadConsumer consumer;
   producer.start ();
   consumer.start ();

   producer.wait ();
   consumer.wait ();
   return app.exec();
}











